package cn.wolfcode.web.interceptor;

import cn.wolfcode.domain.Employee;
import cn.wolfcode.domain.JsonResult;
import cn.wolfcode.domain.Permission;
import cn.wolfcode.util.RequiredPermission;
import cn.wolfcode.util.UserContext;
import com.alibaba.fastjson.JSON;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

public class CheckPermissionInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            Employee currentUser = UserContext.getCurrentUser();
            //判断是否是超级管理员
            if (currentUser.isAdmin()) {
                return true;
            }
            //如果不是超级管理员
            HandlerMethod method = (HandlerMethod) handler;
            //获取当前请求方法上的注解
            RequiredPermission methodAnnotation = method.getMethodAnnotation(RequiredPermission.class);
            //判断方法上有没有贴注解
            if (methodAnnotation == null){
                //如果等于null,就代表方法上没有贴注解,直接放行
                return true;
            }
            //当前方法需要权限控制
            String expression = methodAnnotation.expression();
            //登录的时候需要根据用户id查询出用户的权限,放到session中
            List<Permission> permissionList = UserContext.getCurrentPermission();
            //遍历用户的权限集合,判断当前方法是否在用户权限中
            for (Permission permission : permissionList) {
                if (permission.getExpression().equals(expression)){
                    //说明用户拥有权限,可以直接放行
                    return true;
                }
            }
            //循环完都没有找到，说明用户的权限集合中并没有当前访问方法的权限. 没有权限进行拦截
            //针对不同情况进行处理,根据当前访问方法是否有贴@ResponseBody注解判断是哪种请求
            ResponseBody methodAnnotation1 = method.getMethodAnnotation(ResponseBody.class);
            if (methodAnnotation1 == null){
                //页面请求
               // request.getRequestDispatcher("/WEB-INF/views/common/nopermission.ftl").forward(request,response);
                response.sendRedirect("/nopermission");
            }else {
                //json数据的请求
                response.setContentType("application/json;charset=utf-8");
                String responseData = JSON.toJSONString(new JsonResult(false, "您没有权限操作"));
                response.getWriter().write(responseData);
            }
            return false;
        }
        return true;
    }
}
